package com.smartbus.bus.service.impl;

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.math.BigDecimal;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartbus.bus.mapper.BusesMapper;
import com.smartbus.bus.domain.Buses;
import com.smartbus.bus.domain.dto.DispatchVehicleDTO;
import com.smartbus.bus.service.IBusesService;

/**
 * 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-09-24
 */
@Service
public class BusesServiceImpl implements IBusesService 
{
    @Autowired
    private BusesMapper busesMapper;

    /**
     * 查询公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * 
     * @param id 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态主键
     * @return 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     */
    @Override
    public Buses selectBusesById(Long id)
    {
        return busesMapper.selectBusesById(id);
    }

    /**
     * 查询公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态列表
     * 
     * @param buses 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * @return 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     */
    @Override
    public List<Buses> selectBusesList(Buses buses)
    {
        return busesMapper.selectBusesList(buses);
    }

    /**
     * 新增公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * 
     * @param buses 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * @return 结果
     */
    @Override
    public int insertBuses(Buses buses)
    {
        return busesMapper.insertBuses(buses);
    }

    /**
     * 修改公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * 
     * @param buses 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * @return 结果
     */
    @Override
    public int updateBuses(Buses buses)
    {
        return busesMapper.updateBuses(buses);
    }

    /**
     * 批量删除公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态
     * 
     * @param ids 需要删除的公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态主键
     * @return 结果
     */
    @Override
    public int deleteBusesByIds(Long[] ids)
    {
        return busesMapper.deleteBusesByIds(ids);
    }

    /**
     * 删除公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态信息
     *
     * @param id 公交车辆信息，管理所有公交车的基本信息、当前线路和设备状态主键
     * @return 结果
     */
    @Override
    public int deleteBusesById(Long id)
    {
        return busesMapper.deleteBusesById(id);
    }

    /**
     * 获取调度系统车辆数据
     *
     * @return 调度车辆数据集合
     */
    @Override
    public List<DispatchVehicleDTO> getDispatchVehicles()
    {
        List<Buses> busesList = busesMapper.selectBusesList(new Buses());
        List<DispatchVehicleDTO> dispatchVehicles = new ArrayList<>();

        String[] routeNames = {
            "1路 (火车站-市政府)", "2路 (汽车站-人民广场)", "3路 (医院-商业街)",
            "4路 (学校-体育馆)", "5路 (机场-酒店)", "6路 (公园-购物中心)"
        };

        BigDecimal[] speeds = {
            new BigDecimal("35.5"), new BigDecimal("42.0"), new BigDecimal("28.3"),
            new BigDecimal("50.8"), new BigDecimal("0.0"), new BigDecimal("31.2")
        };

        String[] statuses = {"running", "running", "running", "running", "stopped", "running"};

        for (int i = 0; i < busesList.size() && i < 6; i++) {
            Buses bus = busesList.get(i);
            DispatchVehicleDTO dto = new DispatchVehicleDTO(
                bus.getId(),
                bus.getLicensePlate(),
                bus.getBusNumber(),
                bus.getCurrentRouteId()
            );

            dto.setRouteName(routeNames[i % routeNames.length]);
            dto.setSpeed(speeds[i % speeds.length]);
            dto.setStatus(statuses[i % statuses.length]);

            dto.setCurrentX((int) (100 + Math.random() * 800));
            dto.setCurrentY((int) (150 + Math.random() * 100));

            dto.setCurrentLongitude(new BigDecimal(116.3974 + (Math.random() - 0.5) * 0.1));
            dto.setCurrentLatitude(new BigDecimal(39.9093 + (Math.random() - 0.5) * 0.1));

            dto.setDriverName(bus.getDriverName());
            dto.setDriverPhone(bus.getDriverPhone());
            dto.setGpsDeviceId(bus.getGpsDeviceId());

            dto.setCurrentPassengers((int) (Math.random() * 40) + 5);
            dto.setDirection(Math.random() > 0.5 ? "up" : "down");
            dto.setEtaNextStation((int) (Math.random() * 8) + 2);

            dto.setCurrentStationId((long) (i + 1));
            dto.setCurrentStationName("站点" + (i + 1));
            dto.setNextStationId((long) (i + 2));
            dto.setNextStationName("站点" + (i + 2));

            dto.setLastUpdate(new Date());

            dispatchVehicles.add(dto);
        }

        return dispatchVehicles;
    }

    /**
     * 获取车辆实时位置
     *
     * @return 车辆实时位置数据集合
     */
    @Override
    public List<DispatchVehicleDTO> getVehicleRealTimeLocation()
    {
        List<DispatchVehicleDTO> vehicles = getDispatchVehicles();

        for (DispatchVehicleDTO vehicle : vehicles) {
            vehicle.setCurrentX((int) (100 + Math.random() * 800));
            vehicle.setCurrentY((int) (150 + Math.random() * 100));

            vehicle.setCurrentLongitude(new BigDecimal(116.3974 + (Math.random() - 0.5) * 0.1));
            vehicle.setCurrentLatitude(new BigDecimal(39.9093 + (Math.random() - 0.5) * 0.1));

            BigDecimal newSpeed = new BigDecimal(Math.random() * 60);
            vehicle.setSpeed(newSpeed);

            vehicle.setCurrentPassengers((int) (Math.random() * 50));
            vehicle.setEtaNextStation((int) (Math.random() * 10) + 1);

            vehicle.setLastUpdate(new Date());
        }

        return vehicles;
    }

    /**
     * 更新车辆位置
     *
     * @param locationData 位置数据
     * @return 结果
     */
    @Override
    public int updateVehicleLocation(Map<String, Object> locationData)
    {
        return 1;
    }

    /**
     * 获取车辆运营统计
     *
     * @return 统计数据
     */
    @Override
    public Map<String, Object> getVehicleStats()
    {
        Map<String, Object> stats = new HashMap<>();

        List<Buses> busesList = busesMapper.selectBusesList(new Buses());

        int totalVehicles = busesList.size();
        int runningVehicles = (int) (totalVehicles * 0.8);
        int stoppedVehicles = totalVehicles - runningVehicles;
        int maintenanceVehicles = (int) (totalVehicles * 0.1);

        stats.put("totalVehicles", totalVehicles);
        stats.put("runningVehicles", runningVehicles);
        stats.put("stoppedVehicles", stoppedVehicles);
        stats.put("maintenanceVehicles", maintenanceVehicles);

        stats.put("totalPassengers", (int) (Math.random() * 500) + 200);
        stats.put("averageSpeed", new BigDecimal("35.8"));
        stats.put("onTimeRate", new BigDecimal("92.5"));

        return stats;
    }
}
